package com.dyj.tiktok.domain.vo;

import com.alibaba.fastjson.annotation.JSONField;
import com.dyj.tiktok.enums.PrivacyLevelEnum;
import com.dyj.tiktok.enums.UploadSourceEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serial;
import java.io.Serializable;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class InitUploadVideoReqVo implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    @JSONField(name = "post_info")
    private PostInfo postInfo;

    @JSONField(name = "source_info")
    private SourceInfo sourceInfo;

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Accessors(chain = true)
    public static class PostInfo implements Serializable {

        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * (必填)
         * 隐私等级:
         * PUBLIC_TO_EVERYONE: 向所有人公开
         * MUTUAL_FOLLOW_FRIENDS: 互相关注的人
         * FOLLOWER_OF_CREATOR: 粉丝
         * SELF_ONLY: 仅自己可见
         * 与查询创作者信息接口返回的privacy_level_options的值之一比配
         * 枚举 {@link PrivacyLevelEnum}
         */
        @JSONField(name = "privacy_level")
        private String privacyLevel;

        /**
         * 标题
         */
        private String title;

        /**
         * 是否禁止Duet
         * Duet是TikTok上的一项功能，允许用户使用其他TikToker的视频创建内容。这两个视频以分屏并排显示，并将同时播放，这与Stitch不同，在Stitch中，两个剪辑被“拼接”在一起形成一个画面，并一个接一个地播放。
         */
        @JSONField(name = "disable_duet")
        private Boolean disableDuet;

        /**
         * 是否禁止Stitch
         * Stitch是TikTok平台上的一种合作内容，意为“缝合”。它允许用户使用其他创作者拍摄的视频（最多5秒），并在该原视频的基础上添加新内容，创作出新的视频。
         */
        @JSONField(name = "disable_stitch")
        private Boolean disableStitch;

        /**
         * 是否禁用评论
         */
        @JSONField(name = "disable_comment")
        private Boolean disableComment;

        /**
         * 视频封面帧数（毫秒）
         * 指定哪一帧（以毫秒为单位）将用作视频封面。
         * 如果未设置，或者指定的值无效，则将封面设置为上传视频的第一帧。
         */
        @JSONField(name = "video_cover_timestamp_ms")
        private Integer videoCoverTimestampMs;

        /**
         * 品牌内容切换
         * 如果视频是为了推广第三方业务而进行的付费合作，则设置为true
         */
        @JSONField(name = "brand_content_toggle")
        private Boolean brandContentToggle;

        /**
         * 是否宣传创作者自己的业务
         * 如果此视频是为了宣传创作者自己的业务，则设置为true
         */
        @JSONField(name = "brand_organic_toggle")
        private Boolean brandOrganicToggle;

        /**
         * 是否ai生成
         * 如果视频是 AI 生成的内容，则设置为则设置为true
         * 如果设置，视频描述中将会标有标签<Creator labeled as AI-generated>
         */
        @JSONField(name = "is_aigc")
        private Boolean isAigc;

    }

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Accessors(chain = true)
    public static class SourceInfo implements Serializable {

        @Serial
        private static final long serialVersionUID = 1L;

        /**
         * 来源（FILE_UPLOAD、PULL_FROM_URL）
         * 枚举 {@link UploadSourceEnum}
         */
        private String source;

        /**
         * 视频大小；source=FILE_UPLOAD 时必填
         */
        @JSONField(name = "video_size")
        private Long videoSize;

        /**
         * 分片大小；source=FILE_UPLOAD 时必填
         */
        @JSONField(name = "chunk_size")
        private Long chunkSize;

        /**
         * 总分片次数；source=FILE_UPLOAD 时必填
         */
        @JSONField(name = "total_chunk_count")
        private Integer totalChunkCount;

        /**
         * 视频网址；source=PULL_FROM_URL 时必填,video_url 的域名或网址前缀应该已经验证
         */
        @JSONField(name = "video_url")
        private String videoUrl;
    }
}
